package api

import (
	"github.com/gin-gonic/gin"
	"hub.hddznet.com/app/framework/action"
	"hub.hddznet.com/uniplatform/framework/net/web"
)

// 封装 app 用户登录接口，统一APP的登录接口的输入输出
// @param appid 约定值
// @param username 用户名
// @param password 密码(必须经过加密)
func (this *appuser) Login(c *gin.Context, fn func(appid, username, password string) (map[string]interface{}, error)) {
	pa := struct {
		Username string `json:"username"`
		Password string `json:"password"`
	}{}
	action.Do(c, &pa, 2, func() (interface{}, error) {
		app := c.GetHeader("APP")
		pa.Password = web.DecBase64(pa.Password)
		obj, err := fn(app, pa.Username, pa.Password)
		if err != nil {
			return nil, err
		}
		return action.JWT.Sign(obj)
	})
}

	/**
	 * @apiDescription 获取用户信息
	 * @apiSuccess {String} _id ID
	 * @apiSuccess {String} sn 工号
	 * @apiSuccess {String} name 姓名
	 * @apiSuccess {String} account 帐号
	 * @apiSuccess {int} sex 性别（为空的时候不显示该字段）
	 * @apiSuccess {String} birth 出生年月（为空的时候不显示该字段）
	 * @apiSuccess {String} idcard 身份证号（为空的时候不显示该字段）
	 * @apiSuccess {String} job 岗位
	 * @apiSuccess {String} email 邮箱
	 * @apiSuccess {String} mobile 手机
	 * @apiSuccess {String} smobile 短号
	 * @apiSuccess {String} state 用户上下班状态 [ 0:下班;1:上班 ]（为空的时候不显示该字段）
	 * @apiSuccess {String} telephone 办公电话
	 * @apiSuccess {String} direct 直属上司ID （为空的时候不显示该字段）
	 * @apiSuccess {int} duty 是否生产值班人员 [ 0:否;1:是 ]
	 * @apiSuccess {String} post 班组职务
	 * @apiSuccess {int} admin 系统管理员 （为空的时候不显示该字段）
	 * @apiSuccess {Object} group 所属部门信息（为空的时候不显示该字段）
	 * @apiSuccessExample HTTP/1.1 200 OK:
		{
		  "Code": 0,
		  "Message": "ok",
		  "Response": {
			"_id": "CDEEADDE-0000-0000-0000-00000000000C",
			"sn": "006",
			"name": "张超",
			"account": "zhangchao",
			"salt": "",
			"sex": 0,
			"birth": "",
			"idcard": "",
			"job": "和达科技",
			"email": "",
			"mobile": "",
			"smobile": "",
			"telephone": "",
			"direct": "",
			"duty": 0,
			"post": "管理员",
			"admin": 1,
			"state": 0,
			"group": {
			  "_id": "806FD5B8-7943-005B-7EA7-830DCDD11DEB",
			  "created": 1519639524,
			  "changed": 1519639524,
			  "code": "C022",
			  "zone": "",
			  "type": "",
			  "name": "深圳市水务（集团）有限公司",
			  "sname": "深圳水务",
			  "level": "",
			  "parent": "",
			  "root": "",
			  "tenantid": 0,
			  "address": "",
			  "position": "",
			  "province": "广东",
			  "city": "深圳市",
			  "district": "福田区",
			  "zipcode": "440304000000",
			  "linkman": "",
			  "phone": "",
			  "status": 1,
			  "remark": "",
			  "order": 1
			}
		  }
		}
	 *
	 */
type ApiUserView struct {
	ID        string      `json:"_id" bson:"_id" xorm:"'_id'"` //ID
	Changed   int64       `json:"changed" bson:"changed" xorm:"'changed'"`
	Sn        string      `json:"sn" bson:"sn" xorm:"sn"`                       // 工号
	Name      string      `json:"name" bson:"name" xorm:"name"`                 // 姓名
	Account   string      `json:"account" bson:"account" xorm:"account"`        // 帐号
	Sex       string      `json:"sex,omitempty" bson:"sex" xorm:"sex"`          // 性别
	Birth     string      `json:"birth,omitempty" bson:"birth" xorm:"birth"`    // 出生年月
	Idcard    string      `json:"idcard,omitempty" bson:"idcard" xorm:"idcard"` // 身份证号
	Job       string      `json:"job" bson:"job" xorm:"job"`                    // 岗位
	Email     string      `json:"email" bson:"email" xorm:"email"`              // 邮箱
	Mobile    string      `json:"mobile" bson:"mobile" xorm:"mobile"`           // 手机
	Smobile   string      `json:"smobile" bson:"smobile" xorm:"smobile"`        // 短号
	State     int         `json:"state" bson:"state" xorm:"state"`              // 上下班状态
	Telephone string      `json:"telephone" bson:"telephone" xorm:"telephone"`  // 办公电话
	Group     interface{} `json:"group,omitempty" bson:"group" xorm:"group"`    // 所属单位ID
	Direct    string      `json:"direct" bson:"direct" xorm:"direct"`           // 直属上司ID
	Duty      string      `json:"duty" bson:"duty" xorm:"duty"`                 // 是否生产值班人员
	Post      string      `json:"post" bson:"post" xorm:"post"`                 // 班组职务
	Admin     int         `json:"admin" bson:"admin" xorm:"admin"`              //是否为管理员
}

func (this *appuser) UserInfo(c *gin.Context, fn func() (ApiUserView, error)) {
	action.Do(c, nil, 0, func() (interface{}, error) {
		return fn()
	})
}

type appuser struct{}

var AppUser *appuser

func init() {
	AppUser = new(appuser)
}
